# -*- coding: utf-8 -*-
# @Time    : 2024/3/10 12:30
# @Author  : xh
# @FileName: handle_excel.py
# @Software: PyCharm
import openpyxl
from typing import List, Dict, Any
"""
知识区：
使用iter_rows提高性能：这个方法比直接遍历所有行（list(sh.rows)）更高效，尤其是对于较大的数据集。它逐行生成数据，而不是一次性加载所有数据到内存中。
关闭工作簿：workbook.close() 关闭工作簿，虽然openpyxl不会自动关闭文件，但添加这行代码有助于释放资源。
sh.rows 是一个生成器，它代表工作表中的所有行。每调用一次 next(sh.rows)，就会获取工作表中的 下一行
"""
class HandleExcel:
    def __init__(self, file_name: str, sheet_name: str):
        """
        :param file_name: Excel文件名
        :param sheet_name: 表单名称
        """
        self.file_name = file_name  # 文件名
        self.sheet_name = sheet_name  # 表单名称

    def read_excel(self) -> List[Dict[str, Any]]:
        """
        读取Excel文件并将数据转换为字典形式
        :return: 包含所有行数据的列表，每个字典代表一行
        """
        workbook = openpyxl.load_workbook(self.file_name)
        sh = workbook[self.sheet_name]
        # 获取表头
        title = [cell.value for cell in next(sh.rows)]
        # 读取表格数据
        cases = [
            dict(zip(title, [cell.value for cell in row]))
            for row in sh.iter_rows(min_row=2)  # 从第二行开始，跳过表头
        ]
        return cases

    def write_data(self, row: int, column: int, value: str) -> None:
        """
        :param row: 写入的行
        :param column: 写入的列
        :param value: 写入的值
        """
        workbook = openpyxl.load_workbook(self.file_name)
        sh = workbook[self.sheet_name]
        sh.cell(row=row, column=column, value=value)
        # 直接保存
        workbook.save(self.file_name)
        workbook.close()

if __name__ == '__main__':
    # 示例使用方法
    excel = HandleExcel('example.xlsx', 'Sheet1')
    data = excel.read_excel()
    print(data)
    excel.write_data(2, 3, 'new_value')
